package com.ingenio.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ingenio.business.DetallePedido;
import com.ingenio.business.EstadoDetallePedido;
import com.ingenio.business.EstadoPedido;
import com.ingenio.business.Pedido;
import com.ingenio.business.Persona;
import com.ingenio.business.Producto;
import com.ingenio.business.Sucursal;
import com.ingenio.business.TipoPedido;
import com.ingenio.business.UMProducto;
import com.ingenio.dao.EstadoDetallePedidoAdapter;
import com.ingenio.dao.EstadoPedidoAdapter;
import com.ingenio.dao.PedidoAdapter;
import com.ingenio.dao.ProductoAdapter;
import com.ingenio.dao.ProveedorAdapter;
import com.ingenio.dao.SucursalAdapter;
import com.ingenio.dao.TipoPedidoAdapter;
import com.ingenio.dao.UMProductoAdapter;

/**
 * Servlet implementation class GenerarPedido
 */
@WebServlet("/generarPedido")
public class GenerarPedido extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private List<DetallePedido> detalle_pedidos;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public GenerarPedido() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.sendRedirect("index.jsp");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String url = request.getHeader("referer");
		String[] parts = url.split("/");
		
		String[] id_productos = request.getParameterValues("id_producto");
		
		EstadoPedido ep = null;
		Sucursal s = null;
		
		try {
			//Obtenemos el estado del pedido
			EstadoPedidoAdapter epa = new EstadoPedidoAdapter();
			//Estado 1: pendiente de entrega
			ep = epa.devolverEstadoPedido(1);
			
			//Obtenemos la sucursal
			SucursalAdapter sa = new SucursalAdapter();
			//HARCODED: tomar de la session del usuario
			s = sa.devolverSucursal(1);
			
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		if("generacion_de_pedido.jsp".equals(parts[parts.length-1])){
			String[] cant_productos = request.getParameterValues("cantidad_producto");
			String[] id_ums = request.getParameterValues("id_um");
			try {
				//Obtenemos el tipo pedido
				TipoPedidoAdapter tpa = new TipoPedidoAdapter();
				//Tipo 1: Venta
				TipoPedido tp = tpa.devolverTipoPedido(1);
				
				//Generamos el Pedido
				Pedido p = new Pedido(new Date(), null, ep, s, tp);
				
				EstadoDetallePedidoAdapter edpa = new EstadoDetallePedidoAdapter();
				EstadoDetallePedido edp = edpa.devolverEstadoDetallePedido(1);
				
				//Generamos los detalles de Pedido
				detalle_pedidos = new ArrayList<DetallePedido>();
				DetallePedido dp = null;
				UMProductoAdapter umpa = new UMProductoAdapter();
				ProductoAdapter pa = new ProductoAdapter();
				Producto pr = null; 
				UMProducto ump = null;
				for (int i = 0; i < cant_productos.length; i++) {
					if(isDouble(cant_productos[i])){
						String id = id_productos[i];
						Double cant = Double.parseDouble(cant_productos[i]);
						pr = pa.devolverProducto(id);
						ump = umpa.devolverUMProducto(pr.getIdProducto(), Integer.parseInt(id_ums[i]));
						dp = new DetallePedido(cant, null, 0.0, pr, p, ump, edp);
						productoExistente(dp);
					}
				}
				
				//Seteamos los detalles del pedido al pedido
				p.setDetalle(detalle_pedidos);
				
				//Guardamos el pedido
				PedidoAdapter pea = new PedidoAdapter();
				pea.agregarPedido(p);
				
				//TODO: Redireccionar a la pagina correspondiente
				
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else if("generacion_pedido_proveedor.jsp".equals(parts[parts.length-1])){
			try {
				String[] cant_productos = request.getParameterValues("cantidadCompra");
				Integer idProv = Integer.parseInt(request.getParameter("codProveedor"));
				ProveedorAdapter prova = new ProveedorAdapter();
				Persona per = prova.devolverProveedor(idProv);
				//Obtenemos el tipo pedido
				TipoPedidoAdapter tpa = new TipoPedidoAdapter();
				//Tipo 2: Compra
				TipoPedido tp = tpa.devolverTipoPedido(2);
				
				//Generamos el Pedido
				Pedido p = new Pedido(new Date(), per, ep, s, tp);
				
				EstadoDetallePedidoAdapter edpa = new EstadoDetallePedidoAdapter();
				EstadoDetallePedido edp = edpa.devolverEstadoDetallePedido(1);
				
				//Generamos los detalles de Pedido
				detalle_pedidos = new ArrayList<DetallePedido>();
				DetallePedido dp = null;
				ProductoAdapter pa = new ProductoAdapter();
				UMProductoAdapter umpa = new UMProductoAdapter();
				Producto pr = null; 
				UMProducto ump = null;
				for (int i = 0; i < cant_productos.length; i++) {
					if(isDouble(cant_productos[i])){
						String id = id_productos[i];
						Double cant = Double.parseDouble(cant_productos[i]);
						pr = pa.devolverProducto(id);
						ump = umpa.devolverUMProducto(pr.getIdProducto(), pr.getUnidadMedidaStock().getIdUnidadMedida());
						dp = new DetallePedido(cant, null, 0.0, pr, p, ump, edp);
						productoExistente(dp);
					}
				}
				
				//Seteamos los detalles del pedido al pedido
				p.setDetalle(detalle_pedidos);
				
				//Guardamos el pedido
				PedidoAdapter pea = new PedidoAdapter();
				pea.agregarPedido(p);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
				System.out.println("ERROR: Llamada a servlet desde ubicacion desconocida");
		}
		
		response.sendRedirect("index.jsp");
	}
	
	public static boolean isDouble(String str)  
	{  
	  try  
	  {  
	    @SuppressWarnings("unused")
		Double i = Double.parseDouble(str);  
	  }  
	  catch(NumberFormatException nfe)  
	  {  
	    return false;  
	  }  
	  return true;  
	}
	
	public static boolean isInteger(String str)  
	{  
	  try  
	  {  
	    @SuppressWarnings("unused")
		Integer i = Integer.parseInt(str);  
	  }  
	  catch(NumberFormatException nfe)  
	  {  
	    return false;  
	  }  
	  return true;  
	}
	
	public void productoExistente(DetallePedido dp){
		if(detalle_pedidos.contains(dp)){
			Integer ind = detalle_pedidos.indexOf(dp);
			DetallePedido dp_aux = detalle_pedidos.get(ind);
			Double cant = dp_aux.getCantidadPedida() + dp.getCantidadPedida();
			dp_aux.setCantidadPedida(cant);
		}else{
			detalle_pedidos.add(dp);
		}
	}

}
